home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 352_01 / vecrot.cpp < prev    next >
C/C++ Source or Header  |  1991-04-22  |  2KB  |  78 lines

  1.  
  2.  
  3.  
  4. /* Vector::rotate()
  5.  *     this routine shifts a vector phase # of pts to the left, with wrap around
  6.  *
  7.  */
  8. #include <stdlib.h>
  9. #include "wtwg.h"
  10. #include "dblib.h"
  11. #include "Vector.h" 
  12.  
  13. Vector&  Vector::rotate (  int phase )
  14.     {
  15.     int  vn =n;  float *vv= v;
  16.     float  *next_v;
  17.     float *hold_real;        // pointer to temp work area.
  18.     int n;
  19.  
  20.     int split;        // where the shifted vector crosses the end & wraps
  21.  
  22.  
  23.     while ( phase > vn )
  24.         {
  25.         phase -= vn;
  26.         }
  27.     while ( phase < 0 )
  28.         {
  29.         phase += vn;
  30.         }
  31.     if ( phase == 0 )
  32.         {
  33.         return *this;
  34.         }
  35.  
  36.     /* how many points can be rotated without crossing the edge of the
  37.      * VECTOR (after this many points, pick up pts from the buffer
  38.      */
  39.     split = vn - phase;
  40.  
  41.  
  42.     /* allocate a hold buffer to save the leftmost points
  43.      * ( ie, those points which will wrap around to the right side )
  44.      * automatically normalized.
  45.      */
  46.     hold_real = (float *) wmalloc( sizeof(float) * phase, "PHCOVEC");
  47.  
  48.     /* move first set of points into the hold buffer
  49.      */
  50.     n =phase;
  51.     while ( --n >= 0 )
  52.         {
  53.         hold_real [n]  = vv[n];
  54.         }
  55.  
  56.     /* pointers to source.
  57.      */
  58.     next_v    = vv + phase;
  59.  
  60.     /* rotate data, source in VECTOR until end, then switch to buffer
  61.      */
  62.     n = vn;
  63.     while (  --vn >= 0  );
  64.         {
  65.         *(v++)      = *(next_v++);
  66.         if ( n == split )
  67.             {
  68.             /* need to cross into the hold buffer
  69.              * becuase we've crossed the edge of the VECTOR
  70.              */
  71.             next_v = hold_real;
  72.             }
  73.         }
  74.     free (hold_real);
  75.     return (*this);      /* Vector::rotate() */
  76.     }
  77.  
  78.